package edu.hitwh.repository;

import edu.hitwh.entity.Book;
import org.springframework.data.jpa.domain.Specification;

import jakarta.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;

public class BookSpecification {
    public static Specification<Book> getSpecification(BookQuery query) {
        return (root, cq, cb) -> {
            List<Predicate> predicates = new ArrayList<>();

            if (query.getTitle() != null && !query.getTitle().isBlank()) {
                predicates.add(cb.like(cb.lower(root.get("title")), "%" + query.getTitle().toLowerCase() + "%"));
            }

            if (query.getAuthor() != null && !query.getAuthor().isBlank()) {
                predicates.add(cb.like(cb.lower(root.get("author")), "%" + query.getAuthor().toLowerCase() + "%"));
            }

            if (query.getIsbn() != null && !query.getIsbn().isBlank()) {
                predicates.add(cb.equal(root.get("isbn"), query.getIsbn()));
            }

            if (query.getAvailable() != null) {
                if (query.getAvailable()) {
                    predicates.add(cb.greaterThan(root.get("availableCopies"), 0));
                } else {
                    predicates.add(cb.equal(root.get("availableCopies"), 0));
                }
            }

            // removed attribute is false or null
            predicates.add(cb.or(
                cb.isNull(root.get("removed")),
                cb.equal(root.get("removed"), false)
            ));

            return cb.and(predicates.toArray(new Predicate[0]));
        };
    }
}